package com.heima.admin.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heima.admin.mapper.AdUserMapper;
import com.heima.admin.service.AdUserService;
import com.heima.common.exception.CustException;
import com.heima.model.admin.dtos.AdUserDTO;
import com.heima.model.admin.pojos.AdUser;
import com.heima.model.admin.vos.AdUserVo;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.AppHttpCodeEnum;
import com.heima.utils.common.AppJwtUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * 用户登录接口实现类
 * @author 29143
 */
@Service
public class AdUserServiceImpl extends ServiceImpl<AdUserMapper, AdUser> implements AdUserService {
    /**
     * 用户登录功能
     * @param dto
     * @return
     */
    @Override
    public ResponseResult login(AdUserDTO dto) {
        //校验参数
        if (StringUtils.isBlank(dto.getName())||StringUtils.isBlank(dto.getPassword())) {
            //当参数有误,给出错误信息
            CustException.cust(AppHttpCodeEnum.PARAM_INVALID,"参数错误");
        }
        //构建查询条件对象
        LambdaQueryWrapper<AdUser> wrapper = Wrappers.lambdaQuery();
        //根据用户名查询用户信息
        AdUser adUser = this.getOne(wrapper.eq(AdUser::getName, dto.getName()));
        //判断查询结果是否为空
        if (adUser==null) {
            //当数据不存在,给出错误信息
            CustException.cust(AppHttpCodeEnum.DATA_NOT_EXIST,"用户名或密码错误");
        }
        //判断用户的id是否为激活状态
        if (adUser.getStatus().intValue()!=9) {
            CustException.cust(AppHttpCodeEnum.LOGIN_STATUS_ERROR,"用户状态异常,请联系管理员");
        }
        //获取查询到的对象的密码
        String password = adUser.getPassword();
        //获取查询到对象的盐
        String salt = adUser.getSalt();
        //获取用户输入的密码,并用MD5加密与查询到对象的盐合并为一个字符串
        String newPassword= DigestUtils.md5DigestAsHex((dto.getPassword() + salt).getBytes());
        //判断查询到对象的密码与用户输入的密码是否一致
        if (!newPassword.equals(password)) {
            //当密码不一致时,给出错误信息
            CustException.cust(AppHttpCodeEnum.LOGIN_PASSWORD_ERROR,"用户名密码错误");
        }
        //修改登陆时间
        adUser.setCreatedTime(new Date());
        //根据id修改用户信息
        this.updateById(adUser);
        //颁发token jwt 令牌
        String token = AppJwtUtil.getToken(adUser.getId().longValue());
        //实例化用户信息对象(AdUserVo)
        AdUserVo adUserVo = new AdUserVo();
        //调用工具类,将adUser用户信息复制到AdUserVo用户信息中
        BeanUtils.copyProperties(adUser,adUserVo);
        //创建一个map集合,用于封装token和adUserVo用户信息
        Map map = new HashMap<>();
        map.put("token",token);
        map.put("user",adUserVo);
        //返回信息
        return ResponseResult.okResult(map);
    }
}
